package com.amigo.online.provider.manager.util.video.uploading;

import java.io.IOException;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.amigo.online.provider.manager.util.param.dto.PageDto;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;

@Component
public class QiniuUtil {

    // 设置好账号的ACCESS_KEY和SECRET_KEY
    private static String ACCESS_KEY;
    private static String SECRET_KEY;
    private static String BUCKET_NAME; // 对应要上传到七牛上 你的那个路径（自己建文件夹 注意设置私有）
    private static String BUCKET_MUSIC_NAME;// 音乐路径
    private static String BUCKET_PICTURE_NAME;// 图片路径

    @Value("${access_key}")
    public void setACCESS_KEY(String aCCESS_KEY) {
        ACCESS_KEY = aCCESS_KEY;
    }

    @Value("${secret_key}")
    public void setSECRET_KEY(String sECRET_KEY) {
        SECRET_KEY = sECRET_KEY;
    }

    @Value("${bucketname}")
    public void setBUCKET_NAME(String bUCKET_NAME) {
        BUCKET_NAME = bUCKET_NAME;
    }

    @Value("${bucket_music_name}")
    public void setBUCKET_MUSIC_NAME(String bUCKET_MUSIC_NAME) {
        BUCKET_MUSIC_NAME = bUCKET_MUSIC_NAME;
    }

    @Value("${bucket_picture_name}")
    public void setUCKET_PICTURE_NAME(String UCKET_PICTURE_NAME) {
        BUCKET_PICTURE_NAME = UCKET_PICTURE_NAME;
    }

    // 创建上传对象
    UploadManager uploadManager = new UploadManager(new Configuration());

    /**
     * 简单上传，使用默认策略，只需要设置上传的空间名就可以了
     *
     * @param fileName 文件上传至七牛云空间的名称
     * @return
     */
    public String getUpToken(String fileName) {
        // 密钥配置
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        // <bucket>:<key>，表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”，已存在同名资源则会被本次覆盖。
        // 如果希望只能上传指定key的文件，并且不允许修改，那么可以将下面的 insertOnly 属性值设为 1。
        // 第三个参数是token的过期时间
        return auth.uploadToken(BUCKET_NAME, fileName, 3600, new StringMap().put("insertOnly", 0));
    }

    public String getUpTokenMusic(String fileName) {
        // 密钥配置
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        // <bucket>:<key>，表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”，已存在同名资源则会被本次覆盖。
        // 如果希望只能上传指定key的文件，并且不允许修改，那么可以将下面的 insertOnly 属性值设为 1。
        // 第三个参数是token的过期时间
        return auth.uploadToken(BUCKET_MUSIC_NAME, fileName, 3600, new StringMap().put("insertOnly", 0));
    }

    public String queryUpToken(PageDto pageutil) {
        // 密钥配置
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        // <bucket>:<key>，表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”，已存在同名资源则会被本次覆盖。
        // 如果希望只能上传指定key的文件，并且不允许修改，那么可以将下面的 insertOnly 属性值设为 1。
        // 第三个参数是token的过期时间
        return auth.uploadToken(pageutil.getBucket());
    }

    public String getUpTokenPicture(String fileName) {
        // 密钥配置
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        // <bucket>:<key>，表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”，已存在同名资源则会被本次覆盖。
        // 如果希望只能上传指定key的文件，并且不允许修改，那么可以将下面的 insertOnly 属性值设为 1。
        // 第三个参数是token的过期时间
        return auth.uploadToken(BUCKET_PICTURE_NAME, fileName, 3600, new StringMap().put("insertOnly", 0));
    }

    /**
     * 普通上传
     *
     * @param filePath 文件路径
     * @param fileName 文件上传至七牛云空间的名称
     * @throws IOException
     */
    public Response upload(String filePath, String filename) {
        try {
            // 调用put方法上传
            Response res = uploadManager.put(filePath, filename, getUpToken(filename));
            return res;
        } catch (QiniuException e) {
            Response r = e.response;
            e.printStackTrace();
            return r;
        }
    }

    /**
     * 图片上传
     *
     * @param filePath 文件路径
     * @param fileName 文件上传至七牛云空间的名称
     * @throws IOException
     */
    public Response uploadPicture(String filePath, String filename) {
        try {
            // 调用put方法上传
            Response res = uploadManager.put(filePath, filename, getUpTokenPicture(filename));
            return res;
        } catch (QiniuException e) {
            Response r = e.response;
            e.printStackTrace();
            return r;
        }
    }

    /**
     * 音乐上传
     *
     * @param filePath 文件路径
     * @param fileName 文件上传至七牛云空间的名称
     * @throws IOException
     */
    public Response uploadMusic(String filePath, String filename) {
        try {
            // 调用put方法上传
            Response res = uploadManager.put(filePath, filename, getUpTokenMusic(filename));
            return res;
        } catch (QiniuException e) {
            Response r = e.response;
            e.printStackTrace();
            return r;
        }
    }

    public static void main(String[] args) {
        new QiniuUtil().upload("D:\\image\\lwl.mp4", "lwltest.mp4");
    }
}
